package com.cskaoyan.javase.oop2._1extends._10final._3variable._2member;

/**
 * final修饰成员变量,表示成员常量,其取值一旦赋值,就不可更改了
 *      而且这个赋值一定要在创建对象的过程中赋值,不可用创建对象之后再赋值
 *
 * 语法:
 *  [访问权限修饰符] final 数据类型 变量名;
 *
 * 回顾一下,创建对象过程中成员变量的赋值手段:
 *      1.默认初始化
 *      2.显式赋值
 *      3.构造代码块
 *      4.构造器
 *
 * 直接写final修饰成员变量,语法会报错,所以成员常量的赋值不能依赖于默认初始化,只能:
 *      1.显式赋值
 *      2.构造代码块
 *      3.构造器
 * 其中选择其一,也必须,也只能选择其一.
 * 稍微需要注意的是,如果选择构造器赋值,必须所有构造器都能完全赋值.
 *
 * 思考:
 *      成员常量是不是一个真正意义上的常量?
 *      不是,因为它属于对象,每个对象可能都有这个常量,它们的取值不唯一,不是真正意义上的常量
 *
 *      如果需要一个真正意义上的常量,需要保持该常量全局唯一,这是final修饰的静态成员变量,称之为静态常量,或者"全局常量".
 *      全局常量是最常见的final修饰的变量
 *
 * @since 11:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Student s = new Student();
        // System.out.println(s.age);
        // s.age = 19;

        Student s = new Student(18);
        Student s2 = new Student(28);
    }
}

class Student {
    // Variable 'age' might not have been initialized
    final int age;
    // {
    //     age = 29;
    // }

    public Student(int age) {
        this.age = age;
    }

    public Student() {
        age = 18;
    }
}